home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / answers / comp / motif-faq / part5 < prev    next >
Internet Message Format  |  1994-04-14  |  73KB

  1. Path: bloom-beacon.mit.edu!grapevine.lcs.mit.edu!uhog.mit.edu!europa.eng.gtefsd.com!news.umbc.edu!cs.umd.edu!kong.gsfc.nasa.gov!kong.gsfc.nasa.gov!not-for-mail
  2. From: dealy@kong.gsfc.nasa.gov (Brian Dealy)
  3. Newsgroups: comp.windows.x.motif,news.answers,comp.answers
  4. Subject: Motif FAQ (Part 5 of 5)
  5. Followup-To: poster
  6. Date: 14 Apr 1994 15:20:38 -0400
  7. Organization: NASA/Goddard Space Flight Center
  8. Lines: 2596
  9. Approved: news-answers-request@MIT.Edu
  10. Distribution: inet
  11. Expires: +1 months
  12. Message-ID: <2ok526$5et@kong.gsfc.nasa.gov>
  13. Reply-To: dealy@kong.gsfc.nasa.gov (Brian Dealy)
  14. NNTP-Posting-Host: kong.gsfc.nasa.gov
  15. Keywords: FAQ question answer
  16. Xref: bloom-beacon.mit.edu comp.windows.x.motif:15730 news.answers:18061 comp.answers:4912
  17.  
  18. Archive-name: motif-faq/part5
  19. Last-modified: APR 04, 1994
  20. Version: 3.6
  21.  
  22.  
  23.  
  24.  
  25.  
  26. -----------------------------------------------------------------------------
  27. Subject: 126)  TOPIC: ICONS
  28.  
  29. Iconification/de-iconification is a co-operative process between a client and
  30. a window manager.  The relevant standards are set by ICCCM.  Mwm is ICCCM
  31. compliant.  The toplevel (non-override-redirect) windows of an application may
  32. be in three states: WithdrawnState (neither the window nor icon visible),
  33. NormalState (the window visible) or IconicState (the icon window or pixmap
  34. visible).  This information is contained in the WM_STATE property but ordinary
  35. clients are not supposed to look at that (its values have not yet been
  36. standardised).  Movement between the three states is standardised by ICCCM.
  37.  
  38. -----------------------------------------------------------------------------
  39. Subject: 127)  How can I keep track of changes to iconic/normal window state?
  40.  
  41. Answer: You can look at the WM_STATE property, but this breaks ICCCM
  42. guidelines.  ICCCM compliant window managers will map windows in changing them
  43. to normal state and unmap them in changing them to iconic state. Look for
  44. StructureNotify events and check the event type:
  45.  
  46.         XtAddEventHandler (toplevel_widget,
  47.                         StructureNotifyMask,
  48.                         False,
  49.                         StateWatcher,
  50.                         (Opaque) NULL);
  51.         ....
  52.         void StateWatcher (w, unused, event)
  53.         Widget w;
  54.         caddr_t unused;
  55.         XEvent *event;
  56.         {
  57.                 if (event->type == MapNotify)
  58.                         printf ("normal\n");
  59.                 else if (event->type == UnmapNotify)
  60.                         printf ("iconified\n");
  61.                 else    printf ("other event\n");
  62.         }
  63.  
  64.  
  65. If you insist on looking at WM_STATE, here is some code (from Ken Sall) to do
  66. it:
  67.  
  68.         /*
  69.         ------------------------------------------------------------------
  70.         Try a function such as CheckWinMgrState below which returns one of
  71.         IconicState | NormalState | WithdrawnState | NULL :
  72.         ------------------------------------------------------------------
  73.         */
  74.         #define WM_STATE_ELEMENTS 1
  75.  
  76.         unsigned long *CheckWinMgrState (dpy, window)
  77.         Display *dpy;
  78.         Window window;
  79.         {
  80.           unsigned long *property = NULL;
  81.           unsigned long nitems;
  82.           unsigned long leftover;
  83.           Atom xa_WM_STATE, actual_type;
  84.           int actual_format;
  85.           int status;
  86.  
  87.             xa_WM_STATE = XInternAtom (dpy, "WM_STATE", False);
  88.  
  89.             status = XGetWindowProperty (dpy, window,
  90.                           xa_WM_STATE, 0L, WM_STATE_ELEMENTS,
  91.                           False, xa_WM_STATE, &actual_type, &actual_format,
  92.                           &nitems, &leftover, (unsigned char **)&property);
  93.  
  94.             if ( ! ((status == Success) &&
  95.                         (actual_type == xa_WM_STATE) &&
  96.                         (nitems == WM_STATE_ELEMENTS)))
  97.                 {
  98.                 if (property)
  99.                     {
  100.                     XFree ((char *)property);
  101.                     property = NULL;
  102.                     }
  103.                 }
  104.             return (property);
  105.         } /* end CheckWinMgrState */
  106.  
  107.  
  108. -----------------------------------------------------------------------------
  109. Subject: 128)  How can I check if my application has come up iconic?  I want
  110. to delay initialisation code and other processing.
  111.  
  112. Answer: Use XtGetValues and check for the XmNinitialState value of the
  113. toplevel shell just before XtMainLoop. -- IconicState is iconic, NormalState
  114. is not iconic.
  115.  
  116.  
  117.  
  118.  
  119. -----------------------------------------------------------------------------
  120. Subject: 129)  How can I start my application in iconic state?
  121.  
  122. Answer: From the command line
  123.  
  124.         application -iconic
  125.  
  126. Using the resource mechanism, set the resource XmNinitialState to IconicState
  127. of the toplevel shell widget (the one returned from XtInitialise).
  128.  
  129. -----------------------------------------------------------------------------
  130. Subject: 130)  How can an application iconify itself?
  131.  
  132. Answer: In R4 and later, use the call XIconifyWindow.
  133.  
  134. For R3, send an event to the root window with a type of WM_CHANGE_STATE and
  135. data IconicState.
  136.  
  137.         void
  138.         IconifyMe (dpy, win)
  139.         Display *dpy;
  140.         Window win;     /* toplevel window to iconify */
  141.         {
  142.                 Atom xa_WM_CHANGE_STATE;
  143.                 XClientMessageEvent ev;
  144.  
  145.                 xa_WM_CHANGE_STATE = XInternAtom (dpy,
  146.                                         "WM_CHANGE_STATE", False);
  147.  
  148.                 ev.type = ClientMessage;
  149.                 ev.display = dpy;
  150.                 ev.message_type = xa_WM_CHANGE_STATE;
  151.                 ev.format = 32;
  152.                 ev.data.l[0] = IconicState;
  153.                 ev.window = win;
  154.  
  155.                 XSendEvent (dpy,
  156.                         RootWindow (dpy, DefaultScreen(dpy)),
  157.                         True,
  158.                         (SubstructureRedirectMask | SubstructureNotifyMask),
  159.                         &ev);
  160.                 XFlush (dpy);
  161.         }
  162.  
  163.  
  164. -----------------------------------------------------------------------------
  165. Subject: 131)  How can an application de-iconify itself?
  166.  
  167. Answer: XMapWindow (XtDisplay (toplevel_widget), XtWindow (toplevel_widget)).
  168.  
  169. -----------------------------------------------------------------------------
  170. Subject: 132)  TOPIC: MISCELLANEOUS
  171.  
  172. -----------------------------------------------------------------------------
  173. Subject: 133)+ How do I controll the repeat rate on a SUN keyboard ??
  174.  
  175.  
  176. Answer:
  177.  
  178.      [...]
  179.  
  180.      -ar1 milliseconds
  181.              This option specifies amount of time in milliseconds
  182.              before   which   a   pressed  key  should  begin  to
  183.              autorepeat.
  184.  
  185.      -ar2 milliseconds
  186.              This option specifies the interval  in  milliseconds
  187.              between autorepeats of pressed keys.
  188.  
  189. Of course this presumes you're using a server based on the MIT sample server.
  190. submitted by: kaleb@x.org (Kaleb Keithley)
  191.  
  192. -----------------------------------------------------------------------------
  193. Subject: 134)  How can I identify the children of a manager widget?
  194.  
  195. Answer: XmNnumChildren (number of widgets in array).
  196.  
  197. -----------------------------------------------------------------------------
  198. Subject: 135)  How do I tell if a scrolled window's scrollbars are visible?
  199.  
  200. Answer: Use XtGetValues() to get the scrollbar widget ID's, then use
  201. XtIsManaged() to see if they are managed (visible).
  202.  
  203. thanks to Ken Lee, klee@synoptics.com
  204.  
  205. -----------------------------------------------------------------------------
  206. Subject: 136)  How can I programatically scroll a XmScrolledWindow in
  207. XmAUTOMATIC mode?
  208.  
  209. Answer: In Motif 1.2, use XmScrollVisible().  If you're using a scrolled text
  210. or scrolled list combination widget, use XmTextScroll() or XmListSet*()
  211. instead.
  212.  
  213. The Motif manuals specifically forbid manipulating the scrollbars directly,
  214. but some people have reported success with XmScrollBarSetValues, with the
  215. "notify" parameter set to "True".
  216.  
  217. thanks to Ken Lee, klee@synoptics.com
  218.  
  219. -----------------------------------------------------------------------------
  220. Subject: 137)  What functions can an application use to change the size or
  221. position of a widget?
  222.  
  223. Answer: Applications should set the values of the XmNx, XmNy, XmNwidth, and
  224. XmNheight resources.
  225.  
  226. Note their
  227. children, relying instead on their internal layout algorithms.  If you really
  228. want specific positions, you must use a manager widget that allows them, e.g.,
  229. XmBulletinBoard.
  230.  
  231. Also note that some manager widgets reject size change requests from their
  232. children when certain resources are set (e.g., XmNresizable on XmForm).
  233. Others allow the the children to resize, but clip the results (e.g.,
  234. XmNallowShellResize on shell widgets).  Make sure you have these resources set
  235. to the policy you want.
  236.  
  237. Due to bugs, some widgets (third party widgets) do not respond to changes in
  238. their width and height.  Sometimes, you can get them to respond correctly by
  239. unmanaging them, setting the resources, then managing them again.
  240.  
  241. Under no circumstances should applications use routines like
  242. XtConfigureWidget() or XtResizeWidget().  These routines are reserved for
  243. widget internals and will seriously confuse many widgets.  _ thanks to Ken
  244. Lee, klee@synoptics.com ----------
  245. -------------------------------------------------------------------
  246. Subject: 138)  What widgets should I use to get the look of push buttons, but
  247. the behaviour of toggle buttons?
  248.  
  249. Answer:
  250.   Use the XmToggleButton widget, setting XmNindicatorOn to False and
  251. XmNshadowThickness to 2.
  252.  
  253. thanks to Ken Lee, klee@synoptics.com ----------
  254. -------------------------------------------------------------------
  255. Subject: 139)+ How do I obtain the size of a unmanaged shell widget?
  256.  
  257. Answer: In the code below, use getsize() for widgets which have been managed,
  258. and getsize2() for newly created shell widgets which have not yet been
  259. managed.
  260.  
  261. getsize2() takes two widget parameters because popup dialogs etc.  _consist_
  262. of two separate widgets - the parent shell and the child bulletin board, form,
  263. whatever.  This important distinction (somewhat glossed over in the Motif
  264. manuals) is the cause of a large number of queries in comp.windows.x.motif.
  265. XmCreate...Dialog() functions return the (bulletin board, form, whatever)
  266. _child_ of the pair, not the parent shell.
  267.  
  268. getsize2() takes the _shell_ widget as it's first parameter, and the shell's
  269. _child_ (the bulletin board, form, whatever) as it's second.  Thus, if you are
  270. using code like widget = XmCreate...Dialog() to create your popup dialogs, use
  271. code like getsize2(XtParent(widget),widget,&width,&height) to get the width
  272. and height. If you use e.g. XmCreateDialogShell() or XtCreatePopupShell(),
  273. then you are creating the the shell widget and it's child explicitly, and can
  274. just pass them into getsize2() with no problem.
  275.  
  276. Note: getsize2() calls getsize().
  277.  
  278. /* getsize(widget,width,height);
  279.  * Widget widget;
  280.  * int *width,*height;
  281.  *
  282.  * returns the width and height of a managed widget */
  283.  
  284.  
  285.  
  286.  
  287. void getsize(l,w,h) Widget l; int *w,*h; { Dimension w_,h_,b_;
  288.  
  289. static Arg size_args[] =
  290.   {
  291.   { XmNwidth,0 },
  292.   { XmNheight,0 },
  293.   { XmNborderWidth,0 },
  294.   };
  295.  
  296. size_args[0].value = (XtArgVal)&w_; size_args[1].value = (XtArgVal)&h_;
  297. size_args[2].value = (XtArgVal)&b_;
  298.  
  299. XtGetValues(l,size_args,3);
  300.  
  301. if (w) *w = w_ + b_; if (h) *h = h_ + b_; } /*
  302. getsize2(shell,child,width,height);
  303.  * Widget shell,child;
  304.  * int *width,*height;
  305.  *
  306.  * returns the width, height of an unmanaged shell widget */
  307.  
  308. void getsize2(p,c,w,h) Widget p,c; int *w,*h; { XtSetMappedWhenManaged(p,0);
  309.  
  310. XtManageChild(c);
  311.  
  312. getsize(p,w,h);
  313.  
  314. XtUnmanageChild(c);
  315.  
  316. XtSetMappedWhenManaged(p,-1); } submitted by: [ Huw Rogers  Communications
  317. Software Engineer, NEC Corporation, Tokyo, Japan ] [ Email:
  318. rogersh@ccs.mt.nec.co.jp  Fax: +81-3-5476-1005  Tel: +81-3-5476-1096 ]
  319.  
  320. -----------------------------------------------------------------------------
  321. Subject: 140)  Can I use XtAddTimeOut(), XtAddWorkProc(), and XtAddInput()
  322. with XtAppMainLoop()?
  323.  
  324. Answer: On many systems, the obsolete XtAdd*() functions are not compatible
  325. with the XtAppMainLoop().  Instead, you should use newer XtAppAddTimeOut(),
  326. XtAppAddWorkProc(), and XtAppAddInput() functions with XtAppMainLoop()
  327.  
  328. thanks to Ken Lee, klee@synoptics.com ----------
  329. -------------------------------------------------------------------
  330. Subject: 141)  Why does XtGetValues() XmNx and XmNwidth return extremely large
  331. values.
  332.  
  333. Answer: You must use the 16 bit "Dimension" and "Position" data types for your
  334. arguments.  If you use 32 bit integers, some implementations will fill the
  335. remaining 16 bits with invalid data, causing incorrect return values.  The
  336. *Motif Programmer's Manual* and the widget man pages specify the correct data
  337. type for each resource.
  338.  
  339. thanks to Ken Lee, klee@synoptics.com ----------
  340. -------------------------------------------------------------------
  341. Subject: 142)  Can I specify callback functions in resource files?
  342.  
  343. Answer: To specify callbacks, you must use UIL in addition to or in place of
  344. resource files.  You can, however, specify translations in resource files,
  345. which give you most of the same functionality as callback functions.
  346.  
  347. thanks to Ken Lee, klee@synoptics.com ----------
  348. -------------------------------------------------------------------
  349. Subject: 143)  How do I specify a search path for ".uid" files?  Answer: Use
  350. the UIDPATH environment variable.  It is documented on the MrmOpenHierarchy()
  351. man page.
  352.  
  353. -----------------------------------------------------------------------------
  354. Subject: 144)  XtGetValues() on XmNx and XmNy of my top level shell don't
  355. return the correct root window coordinates.  How do I compute these?
  356.  
  357. Answer: XmNx and XmNy are the coordinates relative to your shell's parent
  358. window, which is usually a window manager's frame window.  To translate to the
  359. root coordinate space, use XtTranslateCoords() or XTranslateCoordinates().
  360.  
  361. thanks to Ken Lee, klee@synoptics.com ----------
  362. -------------------------------------------------------------------
  363. Subject: 145)  Can I use XmGetPixmap() with widgets that have non-default
  364. visual types?
  365.  
  366. Answer: If you're using a different depth, use XmGetPixmapByDepth() instead.
  367.  
  368.  thanks to Ken Lee, klee@synoptics.com ----------
  369. -------------------------------------------------------------------
  370. Subject: 146)  How can I determine the item selected in a option menu or a
  371. RadioBox?
  372.  
  373. Answer: The value of the XmNmenuHistory resource of the XmRowColumn parent is
  374. the widget ID of the last selected item.  It works the same way for all menus
  375. and radio boxes.  thanks to Ken Lee, klee@synoptics.com
  376.  
  377. -----------------------------------------------------------------------------
  378. Subject: 147)  What is the matter with Frame in Motif 1.2?
  379.  
  380. [Last modified: November 92]
  381.  
  382. Answer: This announcement has been made by OSF:
  383.  
  384. "IMPORTANT NOTICE
  385.  
  386. We have discovered two problems in the new 1.2 child alignment resources in
  387. XmFrame. Because some vendors may have committed, or are soon to commit to
  388. field releases of Motif 1.2 and 1.2.1, OSF's options for fixing them are
  389. limited. We are trying to deal with these in a way that does not cause
  390. hardship for application developers who will develop applications against
  391. various point versions of Motif. OSF's future actions for correction are
  392. summarized.
  393.  
  394. WHAT YOU SHOULD DO AND KNOW
  395.  
  396. 1. Mark the following change in your documentation.
  397.  
  398. On page 1-512 of the OSF/Motif Programmer's Reference, change the descriptions
  399. under XmNchildVerticalAlignment as follows (what follows is the CORRECT
  400. wording to match the current implementation):
  401.  
  402. XmALIGNMENT_WIDGET_TOP
  403.         Causes the BOTTOM edge of the title area to align
  404.         vertically with the top shadow of the Frame.
  405.  
  406. XmALIGNMENT_WIDGET_BOTTOM
  407.         Causes the TOP edge of the title area to align
  408.         vertically with the top shadow of the Frame.
  409.  
  410. 2. Note the following limitation on resource converters for Motif 1.2 and
  411. 1.2.1 implementations.
  412.  
  413. The rep types for XmFrame's XmNentryVerticalAlignment resource were
  414. incorrected implemented, which means that converters will not work properly.
  415. The following resource settings will not work from a resource file in 1.2 and
  416. 1.2.1:
  417.  
  418.         *childVerticalAlignment: alignment_baseline_bottom
  419.         *childVerticalAlignment: alignment_baseline_top
  420.         *childVerticalAlignment: alignment_widget_bottom
  421.         *childVerticalAlignment: alignment_widget_top
  422.  
  423. If you wish to set these values for these resources (note they are new
  424. rces in XmFrame) you will have to set them directly in C or
  425. via uil.
  426.  
  427. WHAT WE WILL DO
  428.  
  429. The problem described in note #1 above will not be fixed in the OSF/Motif
  430. implementation until the next MAJOR release of Motif.  At that time we will
  431. correct the documentation and modify the code to match those new descriptions,
  432. but we will preserve the existing enumerated values and their behavior for
  433. backward compatibility for that release.
  434.  
  435. The fix for the problem described in note #2 will be shipped by OSF in Motif
  436. 1.2.2.
  437.  
  438. SUMMARY
  439.  
  440. We are sorry for any difficulty this causes Motif users.  If you have any
  441. questions or flames (I suppose I deserve it) please send them directly to me.
  442. We sincerely hope this proactive response is better for our customers than you
  443. having to figure it out yourselves!
  444.  
  445. Libby
  446.  
  447.  
  448. -----------------------------------------------------------------------------
  449. Subject: 148)  What is IMUG and how do I join it?
  450.  
  451. Answer: IMUG is the International Motif User Group founded by Quest Windows
  452. Corporation and co-sponsored by FedUNIX.  IMUG is a non-profit organization
  453. working to keep users informed on technical and standards issues, to
  454. strengthen user groups on a local level, to increase communication among users
  455. internationally, and to promote the use of an international conference as a
  456. forum for sharing and learning more about Motif.  You can join it by
  457.  
  458.  1.  Pay the annual membership fee of $20 USD directly to IMUG.  Contact
  459.  
  460.      IMUG
  461.      5200 Great America Parkway
  462.      Santa Clara,  CA  95054
  463.      (408) 496-1900
  464.      imug@quest.com
  465.  
  466.  2.  Register at the International Motif User Conference, and automatically
  467.      become an IMUG member.
  468.  
  469.  3.  Donate a pd widget, widget tool or widget builder to the IMUG Widget
  470.      Depository and receive a free one year IMUG membership.
  471.  
  472.  
  473. -----------------------------------------------------------------------------
  474. Subject: 149)  What is the X Professional Organization
  475.  
  476. [Last modified: JAN 02 1994]
  477.  
  478. Answer: The X Professional Organization's (XPO) purpose is to provide service
  479. to the X community.  It will serve as an information conduit for professional
  480. users of X.  XPO will participate in X activities, and help keep its members
  481. informed on X related issues.
  482.  
  483. http://
  484. In addition to the communication that professional organizations offer, XPO
  485. provides these other benefits to members:
  486.  
  487.     * subscription to the The X Resource, a quarterly publication
  488.       by O'Reilly & Associates, Inc.,
  489.  
  490.     * discounts on X related products, 20% off most new books
  491.  
  492. *** For a sample issue of the newsletter,
  493. *** email  XPO@DELPHI.COM and include your surface address:
  494.  
  495.     * the XPO quarterly newsletter featuring:
  496.          o highlights of conference activities,
  497.          o new product information,
  498.          o articles highlighting the latest innovations in X,
  499.          o feedback from developers and users of X,
  500.          o calendar of activities,
  501.          o forum for X professionals to interact and learn,
  502.          o and much more...
  503.  
  504. Membership Information:
  505. Annual pricing information in US dollars.
  506.  
  507. Associate:  Quarterly newsletter
  508. Regular: Quarterly newsletter + subscription to The X Resource
  509. Special: Regular + The X Resource  supplemental issues
  510.  
  511. Country               Associate    Regular     Special
  512. USA                     $35.00     $100.00     $120.00
  513. Canada & Mexico         $40.00     $105.00     $135.00
  514. Europe & Africa         $45.00     $125.00     $175.00
  515. Asia & Australia        $50.00     $130.00     $185.00
  516.  
  517.  
  518. Contact:  X Professional Organization, Post Office Box 78, Beltsville,
  519. Maryland, 20704  USA
  520.  
  521. phone: (301) 681 - 2230
  522. fax:   (410) 465 - 9918, email: XPO@DELPHI.COM
  523.  
  524. <A HREF= "http://nearnet.gnn.com/gnn/meta/internet/mkt/xpo/profile.html" XPO Company profile </a>
  525.  
  526.  
  527. -----------------------------------------------------------------------------
  528. Subject: 150)  How do I set the title of a top level window?
  529.  
  530. [Last modified: September 92]
  531.  
  532. Answer: Set XmNtitle (and optionally XmNtitleEncoding) for TopLevelShells.
  533. (Note that this is of type String rather than XmStrin.) Ypu can also set
  534. XmNiconName if you want its icon to show this title.  For XmDialogShells, set
  535. the XmNdialogTitle of its immediate child, assuming it's a BulletinBoard
  536. subclass.  These can also be set in resource files.
  537.  
  538.  
  539. -----------------------------------------------------------------------------
  540. Subject: 151)  Can I use editres with Motif?
  541. [Last modified: January 93]
  542.  
  543. Answer: It isn't built in to Motif (at 1.2.0), but you can do this in your
  544. application
  545.  
  546.     extern void _XEditResCheckMessages();
  547.     ...
  548.     XtAddEventHandler(shell_widget, (EventMask)0, True,
  549.                         _XEditResCheckMessages, NULL);
  550.  
  551. once for each shell widget that you want to react to the "click to select
  552. client" protocol.  Then link your client with the R5 libXmu.
  553.  
  554. David Brooks, OSF
  555.  
  556. From Marc Quinton (quinton@stna7.stna7.stna.dgac.fr):
  557.  
  558. With X11R4 see the Editres package which is a port of the X11R5 Editres
  559. protocol and client. You can find it at :
  560.  
  561.  ftp.stna7.stna.dgac.fr(143.196.9.83):/pub/dist/Editres.tar.Z
  562.  
  563. -----------------------------------------------------------------------------
  564. Subject: 152)  How can I put decorations on transient windows using olwm?
  565.  
  566. Answer: From Jean-Philippe Martin-Flatin <syj@ecmwf.co.uk>
  567.  
  568. /**********************************************************************
  569. ** WindowDecorations.c
  570. **
  571. ** Manages window decorations under the OpenLook window manager (OLWM).
  572. **
  573. ** Adapted from a C++ program posted to comp.windows.x.motif by:
  574. **
  575. **    +--------------------------------------------------------------+
  576. **    | Ron Edmark                          User Interface Group     |
  577. **    | Tel:        (408) 980-1500 x282     Integrated Systems, Inc. |
  578. **    | Internet:   edmark@isi.com          3260 Jay St.             |
  579. **    | Voice mail: (408) 980-1590 x282     Santa Clara, CA 95054    |
  580. **    +--------------------------------------------------------------+
  581. ***********************************************************************/
  582.  
  583. #include <X11/X.h>
  584. #include <X11/Xlib.h>
  585. #include <X11/Xatom.h>
  586. #include <X11/Intrinsic.h>
  587. #include <X11/StringDefs.h>
  588. #include <X11/Protocols.h>
  589. #include <Xm/Xm.h>
  590. #include <Xm/AtomMgr.h>
  591.  
  592. /*
  593. ** Decorations for OpenLook:
  594. ** The caller can OR different mask options to change the frame decoration.
  595. */
  596. #define OLWM_Header     (long)(1<<0)
  597. #define OLWM_Resize     (long)(1<<1)
  598. #define OLWM_Close      (long)(1<<2)
  599.  
  600. /*
  601. ** Prototypes
  602. */
  603. static void InstallOLWMAtoms  (Widget w);
  604. static void AddOLWMDialogFrame(Widget widget, long decorationMask);
  605.  
  606.  
  607. /*
  608. ** Global variables
  609. */
  610. static Atom AtomWinAttr;
  611. static Atom AtomWTOther;
  612. static Atom AtomDecor;
  613. static Atom AtomResize;
  614. static Atom AtomHeader;
  615. static Atom AtomClose;
  616. static int  not_installed_yet = TRUE;
  617.  
  618.  
  619. static void InstallOLWMAtoms(Widget w)
  620. {
  621.         AtomWinAttr = XInternAtom(XtDisplay(w), "_OL_WIN_ATTR" ,    FALSE);
  622.         AtomWTOther = XInternAtom(XtDisplay(w), "_OL_WT_OTHER",     FALSE);
  623.         AtomDecor   = XInternAtom(XtDisplay(w), "_OL_DECOR_ADD",    FALSE);
  624.         AtomResize  = XInternAtom(XtDisplay(w), "_OL_DECOR_RESIZE", FALSE);
  625.         AtomHeader  = XInternAtom(XtDisplay(w), "_OL_DECOR_HEADER", FALSE);
  626.         AtomClose   = XInternAtom(XtDisplay(w), "_OL_DECOR_CLOSE",  FALSE);
  627.  
  628.         not_installed_yet = FALSE;
  629. }
  630.  
  631. static void AddOLWMDialogFrame(Widget widget, long decorationMask)
  632. {
  633.         Atom   winAttrs[2];
  634.         Atom   winDecor[3];
  635.         Widget shell = widget;
  636.         Window win;
  637.         int    numberOfDecorations = 0;
  638.  
  639.         /*
  640.         ** Make sure atoms for OpenLook are installed only once
  641.         */
  642.         if (not_installed_yet) InstallOLWMAtoms(widget);
  643.  
  644.         while (!XtIsShell(shell)) shell = XtParent(shell);
  645.  
  646.         win = XtWindow(shell);
  647.  
  648.         /*
  649.         ** Tell Open Look that our window is not one of the standard OLWM window        ** types. See OLIT Widget Set Programmer's Guide pp.70-73.
  650.         */
  651.  
  652.         winAttrs[0] = AtomWTOther;
  653.  
  654.         XChangeProperty(XtDisplay(shell),
  655.                         win,
  656.                         AtomWinAttr,
  657.                         XA_ATOM,
  658.                         32,
  659.      ce,
  660.                         (unsigned char*)winAttrs,
  661.                         1);
  662.  
  663.         /*
  664.         ** Tell Open Look to add some decorations to our window
  665.         */
  666.         numberOfDecorations = 0;
  667.         if (decorationMask & OLWM_Header)
  668.                 winDecor[numberOfDecorations++] = AtomHeader;
  669.         if (decorationMask & OLWM_Resize)
  670.                 winDecor[numberOfDecorations++] = AtomResize;
  671.         if (decorationMask & OLWM_Close)
  672.         {
  673.                 winDecor[numberOfDecorations++] = AtomClose;
  674.  
  675.                 /*
  676.                 ** If the close button is specified, the header must be
  677.                 ** specified. If the header bit is not set, set it.
  678.                 */
  679.                 if (!(decorationMask & OLWM_Header))
  680.                         winDecor[numberOfDecorations++] = AtomHeader;
  681.         }
  682.  
  683.         XChangeProperty(XtDisplay(shell),
  684.                         win,
  685.                         AtomDecor,
  686.                         XA_ATOM,
  687.                         32,
  688.                         PropModeReplace,
  689.                         (unsigned char*)winDecor,
  690.                         numberOfDecorations);
  691. }
  692.  
  693.  
  694. /*
  695. ** Example of use of AddOLWMDialogFrame, with a bit of extra stuff
  696. */
  697. void register_dialog_to_WM(Widget shell, XtCallbackProc Cbk_func)
  698. {
  699.         Atom atom;
  700.  
  701.         /*
  702.         ** Alias the "Close" item in system menu attached to dialog shell
  703.         ** to the activate callback of "Exit" in the menubar
  704.         */
  705.         if (Cbk_func)
  706.         {
  707.             atom = XmInternAtom(XtDisplay(shell),"WM_DELETE_WINDOW",TRUE);
  708.             XmAddWMProtocolCallback(shell,atom, Cbk_func,NULL);
  709.         }
  710.  
  711.         /*
  712.         ** If Motif is the window manager, skip OpenLook specific stuff
  713.         */
  714.         if (XmIsMotifWMRunning(shell)) return;
  715.  
  716.         /*
  717.         ** Register dialog shell to OpenLook.
  718.         **
  719.         ** WARNING: on some systems, adding the "Close" button allows the title
  720.         ** to be properly centered in the title bar. On others, activating
  721.         ** "Close" crashes OpenLook. The reason is not clear yet, but it seems
  722.         ** the first case occurs with OpenWindows 2 while the second occurs with
  723.         ** Openwindows 3. Thus, comment out one of the two following lines as
  724.         ** suitable for your site, and send e-mail to syj@ecmwf.co.uk if you
  725.         ** find out what is going on !
  726.         */
  727.         AddOLWMDialogFrame(shell,(OLWM_Header | OLWM_Resize));
  728. /*      AddOLWMDialogFrame(shell,(OLWM_Header | OLWM_Resize | OLWM_Close)); */
  729. }
  730.  
  731.  
  732. -----------------------------------------------------------------------------
  733. Subject: 153)  Why does an augment translation appear to act as replace for
  734. some widgets?  When I use either augment or override translations in
  735. .Xdefaults it seems to act as replace in both Motif 1.0 and 1.1
  736.  
  737. Answer: By default, the translation table is NULL.  If there is nothing
  738. specified (either in resource file, or in args), the widget's Initialize
  739. finds: Oh, there is NULL in translations, lets use our default ones.  If,
  740. however, the translations have become non-NULL, the default translations are
  741. NOT used at all. Thus, using #augment, #override or a new table has identical
  742. effect: defines the new translations. The only way you can augment/override
  743. Motif's default translations is AFTER Initialize, using XtSetValues.  Note,
  744. however, that Motif managers do play with translation tables as well ... so
  745. that results are not always easy to predict.
  746.  
  747. From OSF: A number of people have complained about not being able to
  748. augment/override translations from the .Xdefaults.  This is due to the
  749. complexity of the menu system/keyboard traversal and the necessary
  750. translations changes required to support the Motif Style Guide in menus.  It
  751. cannot be fixed in a simple way. Fixing it requires re-design of the
  752. menus/buttons and it is planned to be fixed in 1.2.
  753.  
  754.  
  755.  
  756.  
  757.  
  758. -----------------------------------------------------------------------------
  759. Subject: 154)  How do you "grey" out a widget so that it cannot be activated?
  760.  
  761. Answer: Use XtSetSensitive(widget, False). Do not set the XmNsensitive
  762. resource directly yourself (by XtSetValues) since the widget may need to talk
  763. to parents first.
  764.  
  765.  
  766. -----------------------------------------------------------------------------
  767. Subject: 155)  Why doesn't the Help callback work on some widgets?
  768.  
  769. Answer: If you press the help key the help callback of the widget with the
  770. keyboard focus is called (not the one containing the mouse).  You can't get
  771. the help callback of a non-keyboard-selectable widget called. To get `context
  772. sensitive' help on these, you have to find the mouse, associate its position
  773. with a widget and then do the help.
  774.  
  775.  The X Resource, Issue 6, has an article on implementing context help in
  776.  Motif in this manner, that is, using the mouse position to indicate the
  777.  widget for which context help is desired, as well as using resources to
  778.  specify the help.  Example source code is available at
  779.  
  780.          ftp.uu.net:/published/oreilly/xresource/helpdemo.tar.Z
  781.  
  782.  The demo program lets you toggle between using the method described in
  783.  the article and XmTrackingLocate() for comparision purposes.
  784.  
  785. contributed by: Jay Schmidgall  jay@vnet.ibm.com (author of the article
  786. mentioned above) --
  787.  
  788.  
  789.  
  790. -----------------------------------------------------------------------------
  791. Subject: 156)  Where can I get a Table widget?
  792.  
  793. [Last modified: December 92]
  794.  
  795. Answer: Send email to Kee Hinckley (nazgul@alfalfa.com) asking for a copy of
  796. his table widget.  The Widget Creation Library also has one.  See under Motif
  797. prototyping tools for the contact.
  798.  
  799. Expert Database Systems, Inc., 377 Rector Place, Suite 3L New York, NY 10280.
  800. Phone: (212) 783-6981 has a very comprehensive table widget that uses both
  801. motif scrollbars or a "virtual" scrollbar showing a miniature version of the
  802. entire spreadsheet. Allows for different width columns, changing colors in
  803. each cell.  Only one X-Window is used so as to reduce the amount of system
  804. resources used.  Contact Ken Jones email: ken@mr_magoo.sbi.com)
  805.  
  806.  
  807. -----------------------------------------------------------------------------
  808. Subject: 157)  Has anyone done a bar graph widget?
  809. [Last modified: September 92]
  810.  
  811. Answer: You can fake one by using for each bar a scroll bar or even a label
  812. which changes in size, put inside a container of some kind.
  813.  
  814. Try the StripChart widget in the Athena widget set. Set the XtNupdate resource
  815. to 0 to keep it from automatically updating.
  816.  
  817. The comp.windows.x FAQ mentions a bar graph widget.
  818.  
  819. Expert Database Systems, Inc.  sells a bar graph widget as well as a multi-
  820. line graph with automatic scaling, a 3-D surface graph, and a high/Low graph
  821. with two lines for moving averages.  Contact Ken Jones Expert Database
  822. Systems, Inc., 377 Rector Place, Suite 3L New York, NY 10280.  Phone: (212)
  823. 783-6981
  824.  
  825.  
  826. The Xtra XWidget library contains a set of widgets that are subclassed from
  827. and compatible with either OSF/Motif or OLIT widgets.  The library includes
  828. widgets that implement the following:
  829.  
  830.    Spreadsheet
  831.    Bar Graph
  832.    Stacked Bar Graph
  833.    Line Graph
  834.    Pie Chart
  835.    XY Plot
  836.    Hypertext
  837.    Hypertext based Help System
  838.    Entry Form with type checking
  839.  
  840. Contact Graphical Software Technology at 310-328-9338  (info@gst.com) for
  841. information.
  842.  
  843. The XRT/graph widget, available for Motif, XView and OLIT, displays X-Y plots,
  844. bar and pie charts, and supports user-feedback, fast updates and PostScript
  845. output. Contact KL Group Inc. at 416-594-1026 (xrt_info%klg@uunet.ca)
  846.  
  847. The product Xmath, made by Integrated Systems Inc. is a product which has
  848. interactive 2d and 3d graphics for bar,strip,line,symbol,
  849. surface,contour,etc... that costs $2500.00 for commercial use and a mere
  850. $250.00 for university use that also has complete numerics capabilities, an
  851. easy to use debugger, a complete high level language, a spreadsheet, a motif
  852. gui access capability, and much more all created on top of motif.
  853.  
  854. You can either email to xmath-info@isi.com or call (408)980-1500.
  855.  
  856. Digital Equipment Corporation (DEC) provides the following product NetEd: "The
  857. network editor widget is a Motif toolkit conforming widget that applications
  858. aphically in the form of
  859. networks or graphs. The network editor supports interactive or application-
  860. controlled creation and editing of directed graphs or networks."
  861.  
  862.  
  863. ACE/gr is an X based XY plotting tool implemented with a point 'n click
  864. paradigm.  A few of its features are:
  865.  
  866.    * Plots up to 10 graphs with 30 data sets per graph.
  867.    * Data read from files and/or pipes.
  868.    * Graph types XY, log-linear, linear-log, log-log, bar,
  869.         stacked bar charts.
  870.  
  871. it is available from
  872.  
  873.         ftp.ccalmr.ogi.edu (presently amb4.ccalmr.ogi.edu)
  874.  
  875. with IP address 129.95.72.34. The XView version (xvgr) will be found in
  876. /CCALMR/pub/acegr/xvgr-2.09.tar.Z and the Motif version (xmgr) in
  877. /CCALMR/pub/acegr/xmgr-2.09.tar.Z.  Comments, suggestions, bug reports to
  878. pturner@amb4.ccalmr.ogi.edu (if mail fails, try pturner@ese.ogi.edu). Due to
  879. time constraints, replies will be few and far between.
  880.  
  881.  
  882.  
  883. -----------------------------------------------------------------------------
  884. Subject: 158)  Does anyone know of a source code of a graph widget where you
  885. can add vertices and edges and get an automated updating?
  886.  
  887. [Last modified: March 93]
  888.  
  889. Answer: The XUG FAQ in comp.windows.x includes information on graph display
  890. widgets.  There is also an implementation in the Asente/Swick book.
  891.  
  892.   From Martin Janzen: "You could have a look at DataViews, from V.I.
  893.    Corporation.  This package is used mainly to display a variety of graph
  894.    drawings (eg. bar, line, pie, high/low, and other charts), and to update
  895.    the graphs as information is received from "data sources" such as files,
  896.    processes (through pipes), or devices.
  897.  
  898.    However, it also provides "node" and "edge" objects which can be used
  899.    when working with network graphs.  The DV-Tools function library
  900.    provides routines which traverse a graph, count visits to each node or
  901.    edge, mark nodes or edges of interest, and so on.  A node or edge object
  902.    can have an associated "geometry object" (such as a symbol or a line),
  903.    which represents that node or edge.
  904.  
  905.    Drawbacks: There's no automatic positioning algorithm; when you add a
  906.    node or edge, you have to create and position its geometry object
  907.    yourself.  Also, this isn't a set of add-on widgets; you can either have
  908.    DataViews create an X window (ie. a separate shell), or you can create
  909.    your own XmDrawingArea and use DataViews to update its window when
  910.    expose events are received.  Finally, the package is quite expensive,
  911.    and there is a run-time charge.
  912.  
  913.    The vendor's address is:
  914.      V.I. Corporation,
  915.      47 Pleasant Street,
  916.      Northampton, MA  01060,
  917.             Email: vi@vicorp.com, Phone: (413) 586-4144, Fax:   (413) 584-2649
  918.  
  919.    or
  920.  
  921.      V.I. Corporation (Europe) Ltd.,
  922.      First Base, Beacontree Plaza,
  923.      Gillette Way,                      Email: viesales@eurovi.uucp
  924.      Reading, Berkshire  RG2 0BP"
  925.    Phone: +44 734 756010,      Fax:   +44 734 756104
  926.  
  927. From Craig Timmerman: Just wanted others to know that there is a third
  928. competitor in what may be come a big market for generic APIs.  The product is
  929. called Open Interface and Neuron Data is the vendor.  Neuron has added some
  930. extra, more complex widgets to their set.  The two most notable are a table
  931. and network widget.  [...] I believe that the network widget got its name from
  932. its ability to display expert system networks that Neuron's AI tools needed.
  933. It would be more aptly named the graph widget.  It can display and manipulate
  934. graphs of various types (trees, directed graphs, etc).  Contact is
  935.  
  936.         Neuron Data
  937.         156 University Avenue
  938.         Palo Alto,  CA  94301
  939.         (415) 321-4488
  940.  
  941.  
  942. prism!gt3273b@gatech.edu  (RENALDS,ANDREW THEODORE) posted a set of public
  943. domain routines for graph drawing.  Contact him for a later set.
  944.  
  945. From Ramon Santiago (santiago@fgssu1.fgs.slb.com): HP has released source code
  946. for XmGraph and XmArc, part of the InterWorks library, which does exactly
  947. this. The sources can be obtained by contacting Dave Shaw,
  948. librarian@iworks.ecn.uiowa.edu. A few trivial source code changes need to be
  949. made to get these widgets to compile under Motif 1.2.
  950.  
  951. Free DAG - directed acyclic graph drawing software in motif environment is
  952. available. Please send a note to address below if you want it:
  953.  
  954. Budak Arpinar, TUBITAK Software Research & Development Center, Ankara,
  955. TURKIYE, E-mail : C51881@TRMETU.BITNET
  956.  
  957.  
  958.  
  959. -----------------------------------------------------------------------------
  960. Subject: 159)+ Is there a help system available, such as in Windows 3?  Or any
  961. Motif based hypertext system.
  962.  
  963. [Last modified: apr 94]
  964.  
  965. Answer:
  966.  
  967. HTML Widget from NCSA:
  968.  
  969. The NCSA Mosaic for X package contains a html widget which is freely available
  970. and is the main vehicle for viewing html documents in the Mosaic program. It
  971. has callbacks for anchor hits, selections, etc and many many resources for
  972. customizing the viewing area of your hypertext documents.
  973.  
  974. GWHIS:
  975.  
  976. There is a new product from Quadralay Corporation, called the Global-Wide Help
  977. & Information Systems (GWHIS).
  978.  
  979. from a press release: AUSTIN, TX (March 3, 1994) Quadralay Corporation today
  980. announced its newest software development tool, Global Wide Help & Information
  981. System (GWHIS).  GWHIS allows third party application developers to add online
  982. documentation and context sensitive help to their applications like never
  983. before.  This documentation may consist of plain text, rich format text,
  984. hypertext, images, audio, and/or video animation and may easily be distributed
  985. either locally or over a wide area network such as the Internet.
  986.  
  987. GWHIS consists of two primary components.  An application programming
  988. interface (API), and a hypermedia viewer (based on technology licensed from
  989. the NCSA Mosaic project).  Several ancillary conversion programs are also
  990. available allowing end users to easily convert existing documentation into
  991. GWHIS' native HTML format.
  992.  
  993. GWHIS is available on the following platforms: SPARC SunOS 4.1.x, SPARC
  994. Solaris 2.x, INTEL SCO Open Desktop, INTEL Solaris 2.x, HP 9000/700, and the
  995. RS/6000. Support for additional platforms (including MS Windows and Macintosh)
  996. is under consideration.  Fully functional evaluation copies of this software
  997. are available upon request or via anonymous ftp from ftp.quadralay.com.
  998.  
  999. Brian Combs Quadralay Corporation combs@quadralay.com
  1000.  
  1001.  
  1002.  
  1003. Bristol Technology have a hypertext system HyperHelp with the look-and-feel of
  1004. either Motif or OpenLook. It should be available from january 31, 1992.
  1005. Contact
  1006.  
  1007.         Bristol Technology Inc.
  1008.         898 Ethan Allen Highway
  1009.         Ridgefield, CT  06877
  1010.         203-438-6969 (phone)
  1011.         203-438-5013 (fax)
  1012.         uunet.uu.net!bristol!keith
  1013.  
  1014. Demos are available by anonymous ftp from  ftp.uu.net (137.39.1.9) in the
  1015. vendor/Bristol/HyperHelp as files sun.motif.tar.Z and hp.tar.Z.
  1016.  
  1017. There was a posting of a motif hypertext-widget to comp.sources.x (Author:
  1018. B.Raoult ( mab@ecmwf.co.uk ) ).  It had the facility to read in helptext from
  1019. a file.
  1020.  
  1021. From Francois Felix Ingrand (felix@idefix.laas.fr): I have translated the Info
  1022. AW (originally written by Jordan Hubbard) to Motif. It is a Widget to browse
  1023. Info files (format used by GNU for their various documentations). I use it as
  1024. the help system of various tool I wrote.  It is available on laas.laas.fr
  1025. (140.93.0.15) in /pub/prs/xinfo-motif.tar.Z
  1026.  
  1027. Form Scott Raney (raney@metacard.com) MetaCard is a commercial package that
  1028. can be used to implement hypertext help.  The text fields support multiple
  1029. typefaces, sizes, styles, colors, subscript/superscript, and hypertext links.
  1030. It has a Motif interface, and a template for calling it from an Xt/Motif
  1031. application is included.  You can FTP a save-disabled distribution from
  1032. ftp.metacard.com or from world.std.com.  For more info, email to
  1033. info@metacard.com.
  1034.  
  1035.  
  1036. The Motifation GbR also provides a hypertext-helpsystem named 'XpgHelp'.
  1037. (Motif look-and-feel / features like those known from MS Windows Help ) For a
  1038. free demo or more information send email either to griebel@uni-paderborn.d e
  1039. or contact the distributor:
  1040.  
  1041.         PEM GmbH,
  1042.         Vaihinger Strasse 49,
  1043.         7000 Stuttgart 80,
  1044.         Germany,
  1045.         +49 (0) 711 713045 (phone),
  1046.         +49 (0) 711 713047 (fax),
  1047. asien@pem-stuttgart.de
  1048.  
  1049. XpgHelp has nearly the same features like HyperHelp: (multiple fonts, graphics
  1050. in b&w and color, different styles, tabs, links, short links, notepad, ...)
  1051.  
  1052. The Interface Builder MOTIFATION uses XpgHelp as its hypertext helpsystem.
  1053.  
  1054.  
  1055.  
  1056. -----------------------------------------------------------------------------
  1057. Subject: 160)  Can I specify a widget in a resource file?
  1058.  
  1059. Answer: This answer, which uses the Xmu library, is due to David Elliott.  If
  1060. the converter is added, then the name of a widget (a string) can be used in
  1061. resource files, and will be converted to the appropriate widget.
  1062.  
  1063. This code, which was basically stolen from the Athena Form widget, adds a
  1064. String to Widget converter.  I wrote it as a general routine that I call at
  1065. the beginning of all of my programs, and made it so I could add other
  1066. converters as needed (like String to Unit Type ;-).
  1067.  
  1068.         #include <X11/Intrinsic.h>
  1069.         #include <X11/StringDefs.h>
  1070.         #include <Xm/Xm.h>
  1071.         #include <X11/Xmu/Converters.h>
  1072.         #include <X11/IntrinsicP.h>
  1073.         #include <X11/CoreP.h>
  1074.  
  1075.         void
  1076.         setupConverters()
  1077.         {
  1078.                 static XtConvertArgRec parentCvtArgs[] = {
  1079.                         {XtBaseOffset, (caddr_t)XtOffset(Widget, core.parent),
  1080.                                 sizeof(Widget)}
  1081.                 };
  1082.  
  1083.                 XtAddConverter(XmRString, XmRWindow, XmuCvtStringToWidget,
  1084.                         parentCvtArgs, XtNumber(parentCvtArgs));
  1085.         }
  1086.  
  1087.  
  1088.  
  1089. -----------------------------------------------------------------------------
  1090. Subject: 161)  Why are only some of my translations are being installed?  I
  1091. have a translation table like the following, but only the first ones are
  1092. getting installed and the rest are ignored.
  1093.  
  1094.  *Text.translations:    #override \
  1095.      Ctrl<Key>a:    beginning-of-line() \n\
  1096.      Ctrl<Key>e:    end-of-line() \n\
  1097.      Ctrl<Key>f:    forward-character() \n\
  1098.  
  1099.  
  1100. Answer: Most likely, you have a space at the end of one of the lines (the
  1101. first in this case).
  1102.  
  1103.      Ctrl<Key>a:    beginning-of-line() \n\
  1104.                                            ^ space here
  1105.  
  1106. The second backslash in each line is there to protect the real newline
  1107. character and so you must not follow it with anything other than the newline
  1108. itself. Otherwise it acts as the end of the resource definition and the
  1109. remaining lines are not added.
  1110.  
  1111.  
  1112. -----------------------------------------------------------------------------
  1113. Subject: 162)  Where can I get the PanHandler code?
  1114.  
  1115. Answer: It is available by email from Chuck Ocheret:  chuck@IMSI.COM.
  1116.  
  1117. -----------------------------------------------------------------------------
  1118. Subject: 163)  What are these passive grab warnings?  When I destroy certain
  1119. widgets I get a stream of messages
  1120.  
  1121.     Warning: Attempt to remove non-existant passive grab
  1122.  
  1123.  
  1124. Answer: They are meaningless, and you want to ignore them.  Do this (from Kee
  1125. Hinckley) by installing an XtWarning handler that explicitly looks for them
  1126. and discards them:
  1127.  
  1128.         static void xtWarnCB(String message) {
  1129.            if (asi_strstr(message, "non-existant passive grab", TRUE)) return;
  1130.            ...
  1131.  
  1132. They come from Xt, and (W. Scott Meeks): "it's something that the designers of
  1133. Xt decided the toolkit should do. Unfortunately, Motif winds up putting
  1134. passive grabs all over the place for the menu system.  On the one hand, we
  1135. want to remove all these grabs when menus get destroyed so that they don't
  1136. leak memory; on the other hand, it's almost impossible to keep track of all
  1137. the grabs, so we have a conservative strategy of ungrabbing any place where a
  1138. grab could have been made and we don't explicitly know that there is no grab.
  1139. The unfortunate side effect is the little passive grab warning messages.
  1140. We're trying to clean these up where possible, but there are some new places
  1141. where the warning is generated.  Until we get this completely cleaned up (1.2
  1142. maybe), your best bet is probably to use a warning handler."
  1143.  
  1144. -----------------------------------------------------------------------------
  1145. Subject: 164)  How do I have more buttons than three in a box?  I want to have
  1146. something like a MessageBox (or other widget) with more than three buttons,
  1147. but with the same nice appearance.
  1148.  
  1149. [Last modified: May 93]
  1150.  
  1151. Answer: The Motif 1.2 MessageBox widget allows extra buttons to be added after
  1152. the OK button. Just create the extra buttons as children of the MessageBox.
  1153. Similarly with the SelectionBox.
  1154.  
  1155. Pre-Motif 1.2, you have to do one of the following methods.
  1156.  
  1157. A SelectionBox is created with four buttons, but the fourth (the Apply button)
  1158. is unmanaged. To manage it get its widget ID via
  1159. XmSelectionBoxGetChild(parent, XmDIALOG_APPLY_BUTTON) and then XtManage it.
  1160. Unmanage all of the other bits in the SelectionBox that you don't want.  If
  1161. you want more than four buttons, try two SelectionBoxes (or similar) together
  1162. in a container, where all of the unwanted parts of the widgets are unmanaged.
  1163.  
  1164. Alternatively, build your own dialog:
  1165.  
  1166. /* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1167.  * This program is freely distributable without licensing fees and
  1168.  * is provided without guarantee or warranty expressed or implied.
  1169.  * This program is -not- in the public domain.  This program is
  1170.  * taken from the Motif Programming Manual, O'Reilly Volume 6.
  1171.  */
  1172.  
  1173. /* action_area.c -- demonstrate how CreateActionArea() can be used
  1174.  * in a real application.  Create what would otherwise be identified
  1175.  * as a PromptDialog, only this is of our own creation.  As such,
  1176.  * we provide a TextField widget for input.  When the user presses
  1177.  * Return, the Ok button is activated.
  1178.  */
  1179. #include <Xm/DialogS.h>
  1180. #include <Xm/PushBG.h>
  1181. #include <Xm/PushB.h>
  1182. #include <Xm/LabelG.h>
  1183. #include <Xm/PanedW.h>
  1184. #include <Xm/Form.h>
  1185. #include <Xm/RowColumn.h>
  1186. #include <Xm/TextF.h>
  1187.  
  1188. typedef struct {
  1189.     char *label;
  1190.     void (*callback)();
  1191.     caddr_t data;
  1192. } ActionAreaItem;
  1193.  
  1194. static void
  1195.     do_dialog(), close_dialog(), activate_cb(),
  1196.     ok_pushed(), cancel_pushed(), help();
  1197.  
  1198. main(argc, argv)
  1199. int argc;
  1200. char *argv[];
  1201. {
  1202.     Widget toplevel, button;
  1203.     XtAppContext app;
  1204.  
  1205.     toplevel = XtVaAppInitialize(&app, "Demos",
  1206.         NULL, 0, &argc, argv, NULL, NULL);
  1207.  
  1208.     button = XtVaCreateManagedWidget("Push Me",
  1209.         xmPushButtonWidgetClass, toplevel, NULL);
  1210.     XtAddCallback(button, XmNactivateCallback, do_dialog, NULL);
  1211.  
  1212.     XtRealizeWidget(toplevel);
  1213.     XtAppMainLoop(app);
  1214. }
  1215.  
  1216. /* callback routine for "Push Me" button.  Actually, this represents
  1217.  * a function that could be invoked by any arbitrary callback.  Here,
  1218.  * we demonstrate how one can build a standard customized dialog box.
  1219.  * The control area is created here and the action area is created in
  1220.  * a separate, generic routine: CreateActionArea().
  1221.  */
  1222. static void
  1223. do_dialog(w, file)
  1224. Widget w; /* will act as dialog's parent */
  1225. char *file;
  1226. {
  1227.     Widget dialog, pane, rc, label, text_w, action_a;
  1228.     XmString string;
  1229.     extern Widget CreateActionArea();
  1230.     Arg args[10];
  1231.     static ActionAreaItem action_items[] = {
  1232.         { "Ok",     ok_pushed,     NULL          },
  1233.         { "Cancel", cancel_pushed, NULL          },
  1234.         { "Close",  close_dialog,  NULL          },
  1235.         { "Help",   help,          "Help Button" },
  1236.     };
  1237.  
  1238.     /* The DialogShell is the Shell for this dialog.  Set it up so
  1239.      * that the "Close" button in the window manager's system menu
  1240.      * destroys the shell (it only unmaps it by default).
  1241.      */
  1242.     dialog = XtVaCreatePopupShell("dialog",
  1243.         xmDialogShellWidgetClass, XtParent(w),
  1244.         XmNtitle,  "Dialog Shell",     /* give arbitrary title in wm */
  1245.         XmNdeleteResponse, XmDESTROY,  /* system menu "Close" action */
  1246.         NULL);
  1247.  
  1248.     /* now that the dialog is created, set the Close button's
  1249.      * client data, so close_dialog() will know what to destroy.
  1250.      */
  1251.     action_items[2].data = (caddr_t)dialog;
  1252.  
  1253.     /* Create the paned window as a child of the dialog.  This will
  1254.      * contain the control area (a Form widget) and the action area
  1255.      * (created by CreateActionArea() using the action_items above).
  1256.      */
  1257.     pane = XtVaCreateWidget("pane", xmPanedWindowWidgetClass, dialog,
  1258.        1,
  1259.         XmNsashHeight, 1,
  1260.         NULL);
  1261.  
  1262.     /* create the control area (Form) which contains a
  1263.      * Label gadget and a List widget.
  1264.      */
  1265.     rc = XtVaCreateWidget("control_area", xmRowColumnWidgetClass, pane, NULL);
  1266.     string = XmStringCreateSimple("Type Something:");
  1267.     XtVaCreateManagedWidget("label", xmLabelGadgetClass, rc,
  1268.         XmNlabelString,    string,
  1269.         XmNleftAttachment, XmATTACH_FORM,
  1270.         XmNtopAttachment,  XmATTACH_FORM,
  1271.         NULL);
  1272.     XmStringFree(string);
  1273.  
  1274.     text_w = XtVaCreateManagedWidget("text-field",
  1275.         xmTextFieldWidgetClass, rc, NULL);
  1276.  
  1277.     /* RowColumn is full -- now manage */
  1278.     XtManageChild(rc);
  1279.  
  1280.     /* Set the client data "Ok" and "Cancel" button's callbacks. */
  1281.     action_items[0].data = (caddr_t)text_w;
  1282.     action_items[1].data = (caddr_t)text_w;
  1283.  
  1284.     /* Create the action area -- we don't need the widget it returns. */
  1285.     action_a = CreateActionArea(pane, action_items, XtNumber(action_items));
  1286.  
  1287.     /* callback for Return in TextField.  Use action_a as client data */
  1288.     XtAddCallback(text_w, XmNactivateCallback, activate_cb, action_a);
  1289.  
  1290.     XtManageChild(pane);
  1291.     XtPopup(dialog, XtGrabNone);
  1292. }
  1293.  
  1294. /*--------------*/
  1295. /* The next four functions are the callback routines for the buttons
  1296.  * in the action area for the dialog created above.  Again, they are
  1297.  * simple examples, yet they demonstrate the fundamental design approach.
  1298.  */
  1299. static void
  1300. close_dialog(w, shell)
  1301. Widget w, shell;
  1302. {
  1303.     XtDestroyWidget(shell);
  1304. }
  1305.  
  1306. /* The "ok" button was pushed or the user pressed Return */
  1307. static void
  1308. ok_pushed(w, text_w, cbs)
  1309. Widget w, text_w;         /* the text widget is the client data */
  1310. XmAnyCallbackStruct *cbs;
  1311. {
  1312.     char *text = XmTextFieldGetString(text_w);
  1313.  
  1314.     printf("String = %s0, text);
  1315.     XtFree(text);
  1316. }
  1317.  
  1318. static void
  1319. cancel_pushed(w, text_w, cbs)
  1320. Widget w, text_w;         /* the text field is the client data */
  1321. XmAnyCallbackStruct *cbs;
  1322. {
  1323.     /* cancel the whole operation; reset to NULL. */
  1324.     XmTextFieldSetString(text_w, "");
  1325. }
  1326.  
  1327. static void
  1328. help(w, string)
  1329. Widget w;
  1330. String string;
  1331. {
  1332.     puts(string);
  1333. }
  1334. /*--------------*/
  1335.  
  1336. /* When Return is pressed in TextField widget, respond by getting
  1337.  * the designated "default button" in the action area and activate
  1338.  * it as if the user had selected it.
  1339.  */
  1340. static void
  1341. activate_cb(text_w, client_data, cbs)
  1342. Widget text_w;              /* user pressed Return in this widget */
  1343. XtPointer client_data;        /* action_area passed as client data */
  1344. XmAnyCallbackStruct *cbs;   /* borrow the "event" field from this */
  1345. {
  1346.     Widget dflt, action_area = (Widget)client_data;
  1347.  
  1348.     XtVaGetValues(action_area, XmNdefaultButton, &dflt, NULL);
  1349.     if (dflt) /* sanity check -- this better work */
  1350.         /* make the default button think it got pushed.  This causes
  1351.          * "ok_pushed" to be called, but XtCallActionProc() causes
  1352.          * the button appear to be activated as if the user selected it.
  1353.          */
  1354.         XtCallActionProc(dflt, "ArmAndActivate", cbs->event, NULL, 0);
  1355. }
  1356.  
  1357. #define TIGHTNESS 20
  1358.  
  1359. Widget
  1360. CreateActionArea(parent, actions, num_actions)
  1361. Widget parent;
  1362. ActionAreaItem *actions;
  1363. int num_actions;
  1364. {
  1365.     Widget action_area, widget;
  1366.     int i;
  1367.  
  1368.     action_area = XtVaCreateWidget("action_area", xmFormWidgetClass, parent,
  1369.         XmNfractionBase, TIGHTNESS*num_actions - 1,
  1370.         XmNleftOffset,   10,
  1371.         XmNrightOffset,  10,
  1372.         NULL);
  1373.  
  1374.     for (i = 0; i < num_actions; i++) {
  1375.         widget = XtVaCreateManagedWidget(actions[i].label,
  1376.             xmPushButtonWidgetClass, action_area,
  1377.             XmNleftAttachment,       i? XmATTACH_POSITION : XmATTACH_FORM,
  1378.             XmNleftPosition,         TIGHTNESS*i,
  1379.             XmNtopAttachment,        XmATTACH_FORM,
  1380.             XmNbottomAttachment,     XmATTACH_FORM,
  1381.             XmNrightAttachment,
  1382.                     i != num_actions-1? XmATTACH_POSITION : XmATTACH_FORM,
  1383.             XmNrightPosition,        TIGHTNESS*i + (TIGHTNESS-1),
  1384.             XmNshowAsDefault,        i == 0,
  1385.             XmNdefaultButtonShadowThickness, 1,
  1386.             NULL);
  1387.         if (actions[i].callback)
  1388.             XtAddCallback(widget, XmNactivateCallback,
  1389.                 actions[i].callback, actions[i].data);
  1390.         if (i == 0) {
  1391.             /* Set the action_area's default button to the first widget
  1392.              * created (or, make the index a parameter to the function
  1393.              * or have it be part of the data structure). Also, set the
  1394.              * pane window constraint for max and min heights so this
  1395.              * particular pane in the PanedWindow is not resizable.
  1396.              */
  1397.             Dimension height, h;
  1398.             XtVaGetValues(action_area, XmNmarginHeight, &h, NULL);
  1399.             XtVaGetValues(widget, XmNheight, &height, NULL);
  1400.             height += 2 * h;
  1401.             XtVaSetValues(action_area,
  1402.                 XmNdefaultButton, widget,
  1403.                 XmNpaneMaximum,   height,
  1404.                 XmNpaneMinimum,   height,
  1405.                 NULL);
  1406.         }
  1407.     }
  1408.  
  1409.     XtManageChild(action_area);
  1410.  
  1411.     return action_area;
  1412. }
  1413.  
  1414.  
  1415.  
  1416. -----------------------------------------------------------------------------
  1417. Subject: 165)  How do I create a "busy working cursor"?
  1418.  
  1419. Answer: - in Baudouin's code (following), the idea is to keep in an array an
  1420. up-to-date list of all shells used in the application, and set for all of them
  1421. the cursor to a watch or to the default cursor, with the 2 functions provided.
  1422.  
  1423. - in Dan Heller's code (later), the idea is to turn on the watch cursor for
  1424. the top-level shell only, popup a working window to possibly abort the
  1425. callback, and manage some expose events during the callback.
  1426.  
  1427. - in the FAQ for comp.windows.x (#113), the idea is to bring a large window on
  1428. top of the application, hide all windows below it, and turn on the watch
  1429. cursor on this large window. Unmapping the large window resets the default
  1430. cursor, mapping it turns on the watch cursor.
  1431.  
  1432. From Baudouin Raoult (mab@ecmwf.co.uk)
  1433.  
  1434. void my_SetWatchCursor(w)
  1435. Widget w;
  1436. {
  1437.         static Cursor watch = NULL;
  1438.  
  1439.         if(!watch)
  1440.                 watch = XCreateFontCursor(XtDisplay(w),XC_watch);
  1441.  
  1442.         XDefineCursor(XtDisplay(w),XtWindow(w),watch);
  1443.         XmUpdateDisplay(w);
  1444. }
  1445.  
  1446. void my_ResetCursor(w)
  1447. Widget w;
  1448. {
  1449.         XUndefineCursor(XtDisplay(w),XtWindow(w));
  1450.         XmUpdateDisplay(w);
  1451. }
  1452.  
  1453.  
  1454. Answer: A solution with lots of bells and whistles is
  1455.  
  1456. /* Written by Dan Heller.  Copyright 1991, O'Reilly && Associates.
  1457.  * This program is freely distributable without licensing fees and
  1458.  * is provided without guarantee or warrantee expressed or implied.
  1459.  * This program is -not- in the public domain.
  1460.  */
  1461.  
  1462. /* busy.c -- demonstrate how to use a WorkingDialog and to process
  1463.  * only "important" events.  e.g., those that may interrupt the
  1464.  * task or to repaint widgets for exposure.  Set up a simple shell
  1465.  * and a widget that, when pressed, immediately goes into its own
  1466.  * loop.  First, "lock" the shell so that a timeout cursor is set on
  1467.  * the shell and pop up a WorkingDialog.  Then enter loop ... sleep
  1468.  * for one second ten times, checking between each interval to see
  1469.  * if the user clicked the Stop button or if any widgets need to be
  1470.  * refreshed.  Ignore all other events.
  1471.  *
  1472.  * main() and get_busy() are stubs that would be replaced by a real
  1473.  * application; all other functions can be used "as is."
  1474.  */
  1475. #include <Xm/MessageB.h>
  1476. #include <Xm/PushB.h>
  1477. #include <X11/cursorfont.h>
  1478.  
  1479. Widget shell;
  1480. void TimeoutCursors();
  1481. Boolean CheckForInterrupt();
  1482.  
  1483. main(argc, argv)
  1484. int argc;
  1485. char *argv[];
  1486. {
  1487.     XtAppContext app;
  1488.     Widget button;
  1489.     XmString label;
  1490.     void get_busy();
  1491.  
  1492.     shell = XtVaAppInitialize(&app, "Demos",
  1493.         NULL, 0, &argc, argv, NULL, NULL);
  1494.  
  1495.     label = XmStringCreateSimple(
  1496.         "Boy, is *this* going to take a long time.");
  1497.     button = XtVaCreateManagedWidget("button",
  1498.         xmPushButtonWidgetClass, shell,
  1499.         XmNlabelString,          label,
  1500.         NULL);
  1501.     XmStringFree(label);
  1502.     XtAddCallback(button, XmNactivateCallback, get_busy, argv[1]);
  1503.  
  1504.     XtRealizeWidget(shell);
  1505.     XtAppMainLoop(app);
  1506. }
  1507.  
  1508. void
  1509. get_busy(widget)
  1510. Widget widget;
  1511. {
  1512.     int n;
  1513.  
  1514.     TimeoutCursors(True, True);
  1515.     for (n = 0; n < 10; n++) {
  1516. ;
  1517.         if (CheckForInterrupt()) {
  1518.             puts("Interrupt!");
  1519.             break;
  1520.         }
  1521.     }
  1522.     if (n == 10)
  1523.         puts("done.");
  1524.     TimeoutCursors(False, NULL);
  1525. }
  1526.  
  1527. /* The interesting part of the program -- extract and use at will */
  1528. static Boolean stopped;  /* True when user wants to stop processing */
  1529. static Widget dialog;    /* WorkingDialog displayed when timed out */
  1530.  
  1531. /* timeout_cursors() turns on the "watch" cursor over the application
  1532.  * to provide feedback for the user that he's going to be waiting
  1533.  * a while before he can interact with the appliation again.
  1534.  */
  1535. void
  1536. TimeoutCursors(on, interruptable)
  1537. int on, interruptable;
  1538. {
  1539.     static int locked;
  1540.     static Cursor cursor;
  1541.     extern Widget shell;
  1542.     XSetWindowAttributes attrs;
  1543.     Display *dpy = XtDisplay(shell);
  1544.     XEvent event;
  1545.     Arg args[1];
  1546.     XmString str;
  1547.     extern void stop();
  1548.  
  1549.     /* "locked" keeps track if we've already called the function.
  1550.      * This allows recursion and is necessary for most situations.
  1551.      */
  1552.     on? locked++ : locked--;
  1553.     if (locked > 1 || locked == 1 && on == 0)
  1554.         return; /* already locked and we're not unlocking */
  1555.  
  1556.     stopped = False; /* doesn't matter at this point; initialize */
  1557.     if (!cursor) /* make sure the timeout cursor is initialized */
  1558.         cursor = XCreateFontCursor(dpy, XC_watch);
  1559.  
  1560.     /* if "on" is true, then turn on watch cursor, otherwise, return
  1561.      * the shell's cursor to normal.
  1562.      */
  1563.     attrs.cursor = on? cursor : None;
  1564.  
  1565.     /* change the main application shell's cursor to be the timeout
  1566.      * cursor (or to reset it to normal).  If other shells exist in
  1567.      * this application, they will have to be listed here in order
  1568.      * for them to have timeout cursors too.
  1569.      */
  1570.     XChangeWindowAttributes(dpy, XtWindow(shell), CWCursor, &attrs);
  1571.  
  1572.     XFlush(dpy);
  1573.  
  1574.     if (on) {
  1575.         /* we're timing out, put up a WorkingDialog.  If the process
  1576.          * is interruptable, allow a "Stop" button.  Otherwise, remove
  1577.          * all actions so the user can't stop the processing.
  1578.          */
  1579.         str = XmStringCreateSimple("Busy.  Please Wait.");
  1580.         XtSetArg(args[0], XmNmessageString, str);
  1581.         dialog = XmCreateWorkingDialog(shell, "Busy", args, 1);
  1582.         XmStringFree(str);
  1583.         XtUnmanageChild(
  1584.             XmMessageBoxGetChild(dialog, XmDIALOG_OK_BUTTON));
  1585.         if (interruptable) {
  1586.             str = XmStringCreateSimple("Stop");
  1587.             XtVaSetValues(dialog, XmNcancelLabelString, str, NULL);
  1588.             XmStringFree(str);
  1589.             XtAddCallback(dialog, XmNcancelCallback, stop, NULL);
  1590.         } else
  1591.             XtUnmanageChild(
  1592.                 XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON));
  1593.         XtUnmanageChild(
  1594.             XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
  1595.         XtManageChild(dialog);
  1596.     } else {
  1597.         /* get rid of all button and keyboard events that occured
  1598.          * during the time out.  The user shouldn't have done anything
  1599.          * during this time, so flush for button and keypress events.
  1600.          * KeyRelease events are not discarded because accelerators
  1601.          * require the corresponding release event before normal input
  1602.          * can continue.
  1603.          */
  1604.         while (XCheckMaskEvent(dpy,
  1605.                 ButtonPressMask | ButtonReleaseMask | ButtonMotionMask
  1606.                 | PointerMotionMask | KeyPressMask, &event)) {
  1607.             /* do nothing */;
  1608.         }
  1609.         XtDestroyWidget(dialog);
  1610.     }
  1611. }
  1612.  
  1613. /* User Pressed the "Stop" button in dialog. */
  1614. void
  1615. stop(dialog)
  1616. Widget dialog;
  1617. {
  1618.     stopped = True;
  1619. }
  1620.  
  1621. Boolean
  1622. CheckForInterrupt()
  1623. {
  1624.     extern Widget shell;
  1625.     Display *dpy = XtDisplay(shell);
  1626.     Window win = XtWindow(dialog);
  1627.     XEvent event;
  1628.  
  1629.     /* Make sure all our requests get to the server */
  1630.     XFlush(dpy);
  1631.  
  1632.     /* Let motif process all pending exposure events for us. */
  1633.     XmUpdateDisplay(shell);
  1634.  
  1635.     /* Check the event loop for events in the dialog ("Stop"?) */
  1636.     while (XCheckMaskEvent(dpy,
  1637.             ButtonPressMask | ButtonReleaseMask | ButtonMotionMask |
  1638.             PointerMotionMask | KeyPressMask | KeyReleaseMask,
  1639.             &event)) {
  1640.         /* got an "interesting" event. */
  1641.         if (event.xany.window == win)
  1642.             XtDispatchEvent(&event); /* it's in our dialog.. */
  1643.         else /* uninteresting event--throw it away and sound bell */
  1644.             XBell(dpy, 50);
  1645.     }
  1646.     return stopped;
  1647. }
  1648.  
  1649.  
  1650. -----------------------------------------------------------------------------
  1651. Subject: 166)  Can I use the hourglass that mwm uses?
  1652.  
  1653. [Last modified: March 93]
  1654.  
  1655. Answer: The hourglass used by mwm is hard-coded into code that is subject to
  1656. OSF copyright. In Motif 1.2 though, the bitmaps for this and other things
  1657. (information, no_enter, question, warning, working) were made available.  The
  1658. install process will probably add them to /usr/include/X11/bitmaps.
  1659. Otherwise, just use the watch cursor XC_watch of the previous question,
  1660. because that has the same semantics.
  1661.  
  1662.  
  1663.  
  1664. -----------------------------------------------------------------------------
  1665. Subject: 167)  What order should the libraries be linked in?
  1666.  
  1667. [Last modified: August 92]
  1668.  
  1669. Answer: At link time, use the library order  -lXm -lXt -lX11. There are two
  1670. reasons for this (dbrooks@osf.org):
  1671.  
  1672. On most systems, the order matters because the linker won't re-scan a library
  1673. once it is done with it.  Thus any references to Xlib calls from Xm will
  1674. probably be unresolved.
  1675.  
  1676. The [other] problem is that there are two VendorShell widgets. A dummy is
  1677. provided in the Xt library, but a widget set will rely on its own being
  1678. referenced.  If you mention Xt first, the linker will choose the wrong one.
  1679.  
  1680. Motif code will wrongly assume the Motif VendorShell has been class-
  1681. initialized [and will probably crash].
  1682.  Xaw has a similar problem, but a softer landing; it only complains about
  1683. unregistered converters.
  1684.  
  1685.  
  1686. -----------------------------------------------------------------------------
  1687. Subject: 168)  How do I use xmkmf for Motif clients?
  1688.  
  1689. [Last modified: October 1992]
  1690.  
  1691. Answer: This advice comes from dbrooks@osf.org:
  1692.  
  1693. There are a number of intractable problems with using X configuration files
  1694. and xmkmf, while trying to make it easy to build Motif.  Not the least of
  1695. these, but one I've never heard mentioned yet, is that the rules for
  1696. contructing the names of shared library macros are machine-dependent, and in
  1697. the various xxxLib.tmpl files.  Do we edit all those files to add definitions
  1698. for XMLIB, DEPXMLIB, etc., or do we put a maze of #ifdefs into the Motif.tmpl
  1699. file?
  1700.  
  1701. Please note that, if you install Motif, it overwrites your installed
  1702. Imake.tmpl with one that includes Motif.tmpl and Motif.rules.
  1703.  
  1704. With those caveats, I think the following guidelines will help.
  1705.  
  1706. David Brooks OSF
  1707.  
  1708. Clients in the X11R5 release use the xmkmf command to build Makefiles.  In
  1709. general, the xmkmf command cannot be used for Motif clients, because of the
  1710. need to consider the UseInstalledMotif flag separately.  Since xmkmf is a
  1711. simple script that calls imake, it is easy to construct the proper call to
  1712. imake using the following rules.
  1713.  
  1714. In the following, replace {MTOP} by the toplevel directory with the Motif
  1715. source tree, and {XTOP} by the toplevel ("mit") directory with the X source.
  1716. It is assumed that the directory containing your installed imake is in your
  1717. PATH.
  1718.  
  1719. When needed, the imake variables XTop and MTop are normally set in your
  1720. site.def (to {XTOP} amd {MTOP} respectively); however they may also be set
  1721. with additional -D arguments to imake.
  1722.  
  1723. 1. With both X and Motif in their source trees, ensure the imake variables
  1724.    XTop and MTop are set, and use:
  1725.  
  1726.         ${XTOP}/config/imake -I{MTOP}/config
  1727.  
  1728. 2. With Motif in its source tree, and X installed, ensure MTop is set, and
  1729.    use:
  1730.  
  1731.         imake -I{MTOP}/config -DUseInstalled
  1732.  
  1733. 3. With both Motif and X installed, and a nonstandard ProjectRoot (see
  1734.    site.def for an explanation of this), use:
  1735.  
  1736.         imake -DUseInstalled -DUseInstalledMotif -I{ProjectRoot}/lib/X11/config
  1737.  
  1738.    or, if the configuration files are in /usr/lib/X11/config:
  1739.  
  1740.         imake -DUseInstalled -DUseInstalledMotif
  1741.  
  1742.  
  1743. To build a simple Imakefile, remember to include lines like this:
  1744.  
  1745.         LOCAL_LIBRARIES = XmClientLibs
  1746.                 DEPLIBS = XmClientDepLibs
  1747.  
  1748. Or, for a client that uses uil/mrm, replace these by MrmClientLibs and
  1749. MrmClientDepLibs, and also use:
  1750.  
  1751.         MSimpleUilTarget(program)
  1752.  
  1753. to build the client and uid file.  Look at the demos for more examples.
  1754.  
  1755.  
  1756. And Paul Howell <grue@engin.umich.edu> added:
  1757.  
  1758. i did this, calling the new script "xmmkmf".  It passes both -DUseInstalled
  1759. and -DUseInstalledMotif.
  1760.  
  1761. and i modified the stock R5 Imake.tmpl to do this:
  1762.  
  1763. #include <Project.tmpl>
  1764. #ifdef UseInstalledMotif
  1765. #include <Motif.tmpl>
  1766. #endif
  1767.  
  1768. #include <Imake.rules>
  1769. #ifdef UseInstalledMotif
  1770. #include <Motif.rules>
  1771. #endif
  1772.  
  1773. the result was something that does both athena and motif rules.  and it really
  1774. works, just that easy!
  1775.  
  1776.  
  1777. -----------------------------------------------------------------------------
  1778. Subject: 169)  How do I make context sensitive help?  The Motif Style Guide
  1779. says that an application must initiate context-sensitive help by changing the
  1780. shape of the pointer to the question pointer. When the user moves the pointer
  1781. to the component help is wanted on and presses BSelect, any available context
  1782. sensitive help for the component must be presented, and the pointer reverts
  1783. from the question pointer.
  1784. [Last modified: August 92]
  1785.  
  1786. Answer: A widget that gives context sensitive help would place this help in
  1787. the XmNhelpCallback function. To trigger this function: (from Martin G C
  1788. Davies, mgcd@se.alcbel.be)
  1789.  
  1790. I use the following callback that is called when the "On Context" help
  1791. pulldown menu is selected. It does the arrow bit and calls the help callbacks
  1792. for the widget. It also zips up the widget tree looking for help if needs be.
  1793. I don't restrict the arrows motion so I can get help on dialog boxes. No
  1794. prizes for guessing what "popup_message" does.
  1795.  
  1796.  
  1797. static void ContextHelp(
  1798.     Widget              w ,
  1799.     Opaque              * tag ,
  1800.     XmAnyCallbackStruct * callback_struct
  1801. )
  1802. {
  1803.     static Cursor   context_cursor = NULL ;
  1804.     Widget          context_widget ;
  1805.  
  1806.     if ( context_cursor == NULL )
  1807.         context_cursor = XCreateFontCursor( display, XC_question_arrow ) ;
  1808.  
  1809.     context_widget = XmTrackingLocate( top_level_widget,
  1810.                                 context_cursor, FALSE ) ;
  1811.  
  1812.     if ( context_widget != NULL ) /* otherwise its not a widget */
  1813.     {
  1814.         XmAnyCallbackStruct cb ;
  1815.  
  1816.         cb.reason = XmCR_HELP ;
  1817.         cb.event = callback_struct->event ;
  1818.  
  1819.         /*
  1820.          * If there's no help at this widget we'll track back
  1821.            up the hierarchy trying to find some.
  1822.          */
  1823.  
  1824.         do
  1825.         {
  1826.             if ( ( XtHasCallbacks( context_widget, XmNhelpCallback ) ==
  1827.                                                 XtCallbackHasSome ) )
  1828.             {
  1829.                 XtCallCallbacks( context_widget, XmNhelpCallback, & cb ) ;
  1830.                 return ;
  1831.             }
  1832.             else
  1833.                 context_widget = XtParent( context_widget ) ;
  1834.         } while ( context_widget != NULL ) ;
  1835.     }
  1836.  
  1837.     popup_message( "No context-sensitive help found\n\
  1838. for the selected object." ) ;
  1839. }
  1840.  
  1841.  
  1842.  
  1843. Dave Bonnett suggested, to use the following translations for XmText (and
  1844. XmTextField) widgets to get the same help with key strokes, and to provide an
  1845. accelerator label in the Context help menu entry.
  1846.  
  1847. MyApp*XmText*translations: #override\n\
  1848.                                 <Key>F1:    Help()
  1849.  
  1850. MyApp*Help_menu*Contextual Help.acceleratorText:   F1
  1851.  
  1852. MyApp*defaultVirtualBindings:           osfBackSpace : <Key>Delete\n\
  1853.                                         osfRight : <Key>Right\n\
  1854.                                         osfLeft  : <Key>Left\n\
  1855.                                         osfUp    : <Key>Up\n\
  1856.                                         osfHelp  : <Key>F1\n\
  1857.                                         osfDown  : <Key>Down
  1858.  
  1859.  
  1860. -----------------------------------------------------------------------------
  1861. Subject: 170)  How do I debug a modal interaction?
  1862.  
  1863. When an application crashes in a modal section (such as in a modal dialog, a
  1864. menu or when a drag and drop is in action), I cannot access the debugger.
  1865.  
  1866. [Last modified: January 1993]
  1867.  
  1868. Answer: Run the debugger on one display while the application writes to
  1869. another display.  ---------
  1870. --------------------------------------------------------------------
  1871. Subject: 171)+ How can I disable Drag and Drop in my Motif 1.2 client ?
  1872.  
  1873. [Last modified: December]
  1874.  
  1875. Answer: Set the XmDisplay drag-protocol resources to XmDRAG_NONE.
  1876.         The following code fragment demonstrates this:
  1877.  
  1878. #include <Xm/Display.h>
  1879.  
  1880.  
  1881.     dw = XmGetXmDisplay(XtDisplay(shell));
  1882.     /* where "shell" is your client's top-level shell. */
  1883.  
  1884.     XtVaSetValues(dw, XmNdragInitiatorProtocolStyle, XmDRAG_NONE, NULL);
  1885.     XtVaSetValues(dw, XmNdragReceiverProtocolStyle,  XmDRAG_NONE, NULL);
  1886.  
  1887.  
  1888. thanks to Lance Purple (purple@austin.ibm.com)
  1889.  
  1890. -----------------------------------------------------------------------------
  1891. Subject: 172)  Where can I get info on the Motif drag and drop protocol?
  1892.  
  1893. [Last modified: March]
  1894.  
  1895. Answer: The drag and drop protocol implemented by OSF is not stable, so they
  1896. have not published it yet. The API should remain stable though.  The OSF
  1897. protocol is not compatable with the OpenLook protocol.  OSF and Sun are
  1898. working on a joint protocol for publication.
  1899.  
  1900. For programming examples on Motif D&D, see the Motif 1.2 Programmers Guide.
  1901.  
  1902. For a third alternative, try Roger Reynolds D&D protocol, available from
  1903. netcom.com in /pub/rogerr.
  1904.  
  1905. -----------------------------------------------------------------------------
  1906. Subject: 173)  TOPIC: ACKNOWLEDGEMENTS
  1907.  
  1908. This list was compiled using questions and answers posed to
  1909. comp.windows.x.motif and motif-talk. Some extracts were also taken from FAQs
  1910. of comp.windows.x.  To all who contributed one way or the other, thanks! I
  1911. haven't often given individual references, but  you may recognise
  1912. contributions. If I have mangled them too much, let me know.
  1913.  
  1914.  
  1915.  
  1916. +----------------------+---+
  1917.   Jan Newmarch, Information Science and Engineering,
  1918.   University of Canberra, PO Box 1, Belconnen, Act 2616
  1919.   Australia. Tel: (Aust) 6-2522422. Fax: (Aust) 6-2522999
  1920.  
  1921.   ACSnet: jan@ise.canberra.edu.au
  1922.   ARPA:   jan%ise.canberra.edu.au@uunet.uu.net
  1923.   UUCP:   {uunet,ukc}!munnari!ise.canberra.edu.au!jan
  1924.   JANET:  jan%au.edu.canberra.ise@EAN-RELAY
  1925.  
  1926.  
  1927. Jan Newmarch of  has been maintaining this FAQ and has really helped a great
  1928. many of us by providing this valuable service.  He deserves a big round of
  1929. applause for his efforts.  I use this resource all the time and it has saved
  1930. me countless hours with manual and source code trying to relearn what others
  1931. have already discovered.  Jan`s efforts are gratefully acknowledged here.
  1932.  
  1933. I am maintaining the FAQ now and will strive to maintain the quality
  1934. that Jan has acheived. Enjoy!
  1935. Brian
  1936.  
  1937. Brian Dealy - X Professional Organization
  1938. dealy@kong.gsfc.nasa.gov
  1939.  
  1940.  
  1941. (301) 572-8267
  1942. (410) 799-7197 (FAX)
  1943. +--------------------------+
  1944.  
  1945.  
  1946.  
  1947.  
  1948.  
  1949.  
  1950.  
  1951.  
  1952.  
  1953.  
  1954.  
  1955.  
  1956.  
  1957.  
  1958.  
  1959.  
  1960.  
  1961.  
  1962.  
  1963.  
  1964.  
  1965.  
  1966.  
  1967.  
  1968.  
  1969.  
  1970.  
  1971.  
  1972.  
  1973.  
  1974.  
  1975.  
  1976.  
  1977.  
  1978.  
  1979.  
  1980.  
  1981.  
  1982.  
  1983.  
  1984.  
  1985.  
  1986.  
  1987.  
  1988.  
  1989.  
  1990.  
  1991.  
  1992.  
  1993.  
  1994.  
  1995.  
  1996.  
  1997.  
  1998.  
  1999.  
  2000.  
  2001.  
  2002.  
  2003.  
  2004.  
  2005.  
  2006.  
  2007.  
  2008.  
  2009.  
  2010.  
  2011.  
  2012.  
  2013.  
  2014.  
  2015.  
  2016.  
  2017.  
  2018.  
  2019.  
  2020.  
  2021.  
  2022.  
  2023.  
  2024.  
  2025.  
  2026.  
  2027.  
  2028.  
  2029.  
  2030.  
  2031.  
  2032.  
  2033.  
  2034.  
  2035.  
  2036.  
  2037.  
  2038.  
  2039.  
  2040.  
  2041.  
  2042.  
  2043.  
  2044.  
  2045.  
  2046.  
  2047.  
  2048.  
  2049.  
  2050.  
  2051.  
  2052.  
  2053.  
  2054.  
  2055.  
  2056.  
  2057.  
  2058.  
  2059.  
  2060.  
  2061.  
  2062.  
  2063.  
  2064.  
  2065.  
  2066.  
  2067.  
  2068.  
  2069.  
  2070.  
  2071.  
  2072.  
  2073.  
  2074.  
  2075.  
  2076.  
  2077.  
  2078.  
  2079.  
  2080.  
  2081.  
  2082.  
  2083.  
  2084.  
  2085.  
  2086.  
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092.  
  2093.  
  2094.  
  2095.  
  2096.  
  2097.  
  2098.  
  2099.  
  2100.  
  2101.  
  2102.  
  2103.  
  2104.  
  2105.  
  2106.  
  2107.  
  2108.  
  2109.  
  2110.  
  2111.  
  2112.  
  2113.  
  2114.  
  2115.  
  2116.  
  2117.  
  2118.  
  2119.  
  2120.  
  2121.  
  2122.  
  2123.  
  2124.  
  2125.  
  2126.  
  2127.  
  2128.  
  2129.  
  2130.  
  2131.  
  2132.  
  2133.  
  2134.  
  2135.  
  2136.  
  2137.  
  2138.  
  2139.  
  2140.  
  2141.  
  2142.  
  2143.  
  2144.  
  2145.  
  2146.  
  2147.  
  2148.  
  2149.  
  2150.  
  2151.  
  2152.  
  2153.  
  2154.  
  2155.  
  2156.  
  2157.  
  2158.  
  2159.  
  2160.  
  2161.  
  2162.  
  2163.  
  2164.  
  2165.  
  2166.  
  2167.  
  2168.  
  2169.  
  2170.  
  2171.  
  2172.  
  2173.  
  2174.  
  2175.  
  2176.  
  2177.  
  2178.  
  2179.  
  2180.  
  2181.  
  2182.  
  2183.  
  2184.  
  2185.  
  2186.  
  2187.  
  2188.  
  2189.  
  2190.  
  2191.  
  2192.  
  2193.  
  2194.  
  2195.  
  2196.  
  2197.  
  2198.  
  2199.  
  2200.  
  2201.  
  2202.  
  2203.  
  2204.  
  2205.  
  2206.  
  2207.  
  2208.  
  2209.  
  2210.  
  2211.  
  2212.  
  2213.  
  2214.  
  2215.  
  2216.  
  2217.  
  2218.  
  2219.  
  2220.  
  2221.  
  2222.  
  2223.  
  2224.  
  2225.  
  2226.  
  2227.  
  2228.  
  2229.  
  2230.  
  2231.  
  2232.  
  2233.  
  2234.  
  2235.  
  2236.  
  2237.  
  2238.  
  2239.  
  2240.  
  2241.  
  2242.  
  2243.  
  2244.  
  2245.  
  2246.  
  2247.  
  2248.  
  2249.  
  2250.  
  2251.  
  2252.  
  2253.  
  2254.  
  2255.  
  2256.  
  2257.  
  2258.  
  2259.  
  2260.  
  2261.  
  2262.  
  2263.  
  2264.  
  2265.  
  2266.  
  2267.  
  2268.  
  2269.  
  2270.  
  2271.  
  2272.  
  2273.  
  2274.  
  2275.  
  2276.  
  2277.  
  2278.  
  2279.  
  2280.  
  2281.  
  2282.  
  2283.  
  2284.  
  2285.  
  2286.  
  2287.  
  2288.  
  2289.  
  2290.  
  2291.  
  2292.  
  2293.  
  2294.  
  2295.  
  2296.  
  2297.  
  2298.  
  2299.  
  2300.  
  2301.  
  2302.  
  2303.  
  2304.  
  2305.  
  2306.  
  2307.  
  2308.  
  2309.  
  2310.  
  2311.  
  2312.  
  2313.  
  2314.  
  2315.  
  2316.  
  2317.  
  2318.  
  2319.  
  2320.  
  2321.  
  2322.  
  2323.  
  2324.  
  2325.  
  2326.  
  2327.  
  2328.  
  2329.  
  2330.  
  2331.  
  2332.  
  2333.  
  2334.  
  2335.  
  2336.  
  2337.  
  2338.  
  2339.  
  2340.  
  2341.  
  2342.  
  2343.  
  2344.  
  2345.  
  2346.  
  2347.  
  2348.  
  2349.  
  2350.  
  2351.  
  2352.  
  2353.  
  2354.  
  2355.  
  2356.  
  2357.  
  2358.  
  2359.  
  2360.  
  2361.  
  2362.  
  2363.  
  2364.  
  2365.  
  2366.  
  2367.  
  2368.  
  2369.  
  2370.  
  2371.  
  2372.  
  2373.  
  2374.  
  2375.  
  2376.  
  2377.  
  2378.  
  2379.  
  2380.  
  2381.  
  2382.  
  2383.  
  2384.  
  2385.  
  2386.  
  2387.  
  2388.  
  2389.  
  2390.  
  2391.  
  2392.  
  2393.  
  2394.  
  2395.  
  2396.  
  2397.  
  2398.  
  2399.  
  2400.  
  2401.  
  2402.  
  2403.  
  2404.  
  2405.  
  2406.  
  2407.  
  2408.  
  2409.  
  2410.  
  2411.  
  2412.  
  2413.  
  2414.  
  2415.  
  2416.  
  2417.  
  2418.  
  2419.  
  2420.  
  2421.  
  2422.  
  2423.  
  2424.  
  2425.  
  2426.  
  2427.  
  2428.  
  2429.  
  2430.  
  2431.  
  2432.  
  2433.  
  2434.  
  2435.  
  2436.  
  2437.  
  2438.  
  2439.  
  2440.  
  2441.  
  2442.  
  2443.  
  2444.  
  2445.  
  2446.  
  2447.  
  2448.  
  2449.  
  2450.  
  2451.  
  2452.  
  2453.  
  2454.  
  2455.  
  2456.  
  2457.  
  2458.  
  2459.  
  2460.  
  2461.  
  2462.  
  2463.  
  2464.  
  2465.  
  2466.  
  2467.  
  2468.  
  2469.  
  2470.  
  2471.  
  2472.  
  2473.  
  2474.  
  2475.  
  2476.  
  2477.  
  2478.  
  2479.  
  2480.  
  2481.  
  2482.  
  2483.  
  2484.  
  2485.  
  2486.  
  2487.  
  2488.  
  2489.  
  2490.  
  2491.  
  2492.  
  2493.  
  2494.  
  2495.  
  2496.  
  2497.  
  2498.  
  2499.  
  2500.  
  2501.  
  2502.  
  2503.  
  2504.  
  2505.  
  2506.  
  2507.  
  2508.  
  2509.  
  2510.  
  2511.  
  2512.  
  2513.  
  2514.  
  2515.  
  2516.  
  2517.  
  2518.  
  2519.  
  2520.  
  2521.  
  2522.  
  2523.  
  2524.  
  2525.  
  2526.  
  2527.  
  2528.  
  2529.  
  2530.  
  2531.  
  2532.  
  2533.  
  2534.  
  2535.  
  2536.  
  2537.  
  2538.  
  2539.  
  2540.  
  2541.  
  2542.  
  2543.  
  2544.  
  2545.  
  2546.  
  2547.  
  2548.  
  2549.  
  2550.  
  2551.  
  2552.  
  2553.  
  2554.  
  2555.  
  2556.  
  2557.  
  2558.  
  2559.  
  2560.  
  2561.  
  2562.  
  2563.  
  2564.  
  2565.  
  2566.  
  2567.  
  2568.  
  2569.  
  2570.  
  2571.  
  2572.  
  2573.  
  2574.  
  2575.  
  2576.  
  2577.  
  2578.  
  2579.  
  2580.  
  2581.  
  2582.  
  2583.  
  2584.  
  2585.  
  2586.  
  2587.  
  2588.  
  2589.  
  2590.  
  2591.  
  2592.  
  2593.  
  2594.  
  2595.  
  2596.  
  2597.  
  2598.  
  2599.  
  2600.  
  2601.  
  2602.  
  2603.  
  2604.  
  2605.  
  2606.  
  2607.  
  2608.  
  2609.  
  2610.  
  2611. -- 
  2612. ..........................
  2613.  
  2614.